package com.example.java_gobang.api;

import com.example.java_gobang.mapper.UserMapper;
import com.example.java_gobang.model.User;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@RestController
public class UserAPI {

    @Resource
    private BCryptPasswordEncoder bCryptPasswordEncoder;
    @Resource
    private UserMapper userMapper;

    @PostMapping("/login")
    @ResponseBody//@ResponseBody的作用其实是将java对象转为json格式的数据
    //登录功能
    public Object login(String username,String password,
    HttpServletRequest request){
        //关键操作,根据username去数据库中查询,如果能找
        //到匹配的用户,并且密码也一致,就认为登录成功
        //这里获得的user对象是数据库操作得到的
        User user=userMapper.selectByName(username);
        System.out.println("[login] username"+username);
        if(user==null||!user.getPassword().equals(password)){
            //登录失败
            System.out.println("登录失败");
            return new User();
        }
        //会话存在就返回,不存在就重新创建一个
        HttpSession httpSession=request.getSession(true);
        //把对象保存到会话里
        httpSession.setAttribute("user",user);
        return user;
    }

    @PostMapping("/register")
    @ResponseBody
    //注册功能
    public Object register(String username,String password){
        //在数据库设计的时候用户名字段值是不能重复的
        try{//注册失败的情况(用户名重复)
            User user=new User();
            user.setUsername(username);
            user.setPassword(password);
            userMapper.insert(user);
            return user;
            //用户名重复
        }catch (org.springframework.dao.DuplicateKeyException e){
            User user=new User();
            return user;//返回空对象
        }

    }
    @GetMapping("/userInfo")
    @ResponseBody
    //获取用户信息
    public  Object getUserInfo(HttpServletRequest request){
        //需要加try catch的原因session是有可能会话为空,会导致httpSession.getAttribute空指针异常
        try{//这里的getSession必须为false,因为是登录之后的信息,有会话就返回,没有就返回空
            HttpSession session=request.getSession(false);
            //httpSession.getAttribute返回类型是object,需要类型强转
            User user=(User)session.getAttribute("user");
            //拿着这个user对象去数据库中找,去找最新更新的数据
            User newUser=userMapper.selectByName(user.getUsername());
            return newUser;
        }catch (NullPointerException e){
            return new User();//返回空对象
        }
    }
}
